GitHub魔方解算器,玩转魔方你最行!
现在程序猿们的娱乐方式是越来越多样,各种游戏主机和游戏实现一次次的打破玩家想象的上限,但是无论技术怎么发展,有些经典的玩意永远不会过时,甚至会和技术完美地结合起来。
魔方,相信大多数程序猿小时候都玩过,最经典最广为流传的就是下面这种3阶魔方。
要想把魔方玩的好,除了反应快、记性好,还要有相当的空间想象能力和推理能力,像这样好玩又益智的玩具,也难怪可以无视电子游戏的崛起,一直流传至今。
而随着科学技术的发展,一部分程序猿想着如何利用程序最快速的拼完一个魔方,美国堪萨斯市软件工程师Paul Rose和Jay Flatland研制的机器人仅用时0.9秒就解开了魔方,首次打破该项世界纪录。随后,德国工程师Albert Beet研制的一款Sub1机器人仅用时0.887秒解开了魔方,再一次刷新该项纪录。
今天要给大家介绍的就是GitHub上一款开源的3阶魔方解算器Qbr
Qbr是一款用Python 3和OpenCV编写的魔方解算程序,可以根据摄像头扫描魔方最终给出一个魔方的完整解算步骤。
开发者是一位荷兰小哥KIM,中文名金可明,金小哥是一位非常喜欢中国的外国友人,自学中文后来到中国留学。考虑到中国程序猿的语言情况,金小哥还把魔方公式中的步骤代号翻译为中文,只需要用摄像头对着魔方进行扫描,通过颜色校准模式来识别,程序会给出最终的操作步骤,非常神奇。最终结果就像下面这样:
步骤数: 20
复原教程:
1. 将魔方的后面旋转180°。
2. 将魔方的顶层旋转180°。
3. 将魔方的前面向左旋转90°。
...
20.将魔方的底层向右旋转90°。
那如何使用这款3阶魔方解算器Qbr?
其实也非常简单,只需要自己的电脑安装好了Python3,Git以及一个摄像头就可以满足使用要求了。
安装命令如下:
$ git clone --depth 1 https://github.com/kkoomen/qbr.git
$ cd qbr
$ python3 -m venv env
$ source ./env/bin/activate
$ pip3 install -r requirements.txt
运行时要需要激活虚拟环境,命令如下:
$ source ./env/bin/activate
$ ./src/qbr.py
操作方式也非常简单,在右上角可以看到当前的接口语言,可以先将环境切换至中文(L键),目前支持以下多种语言模式。最让天朝程序猿开心的就是里面包含了中文~
然后按C键进入颜色校准模式,开始让魔方每一个位面的扫描,扫描完成一个位面之后按空格键保存,等6个位面都识别好了之后,按esc键就可以看到最终结果步骤,左下角会显示扫描的边数。这样,用户就可以知道在按esc键之前是否已扫描了所有面。记得运行时加入参数“-n”或者“--normalize”,这样输出的结果才是“人类可读”的格式。
何谓人类可读?那就例如:
R将是:右转四分之一圈。
F2将是:将正面旋转180度。
解魔方的算法Qbr直接使用了开源的Kociemba算法库,这个算法保障了在20步以内还原任意3阶魔方。同时,前文提到的OpenCV是一套开源的计算机视觉库,从而保障了摄像头识别魔方的完成。
我们一起看下实施原理:
第一步:加载图像,使其变灰,稍微模糊,然后使用Canny边缘检测来定位所有边缘。
self.image = cv2.imread(filename)
gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
canny = cv2.Canny(blurred, 20, 40)
第二步:稍微放大线条,这会使线条变粗,从而更容易找到正方形的轮廓。
kernel = np.ones((3,3), np.uint8)
dilated = cv2.dilate(canny, kernel, iterations=2)
然后,第三步,OpenCV能够找到图像中的所有轮廓,其中轮廓定义为“连接所有连续点(沿边界)的曲线,具有相同的颜色或强度”。
(contours, hierarchy) = cv2.findContours(dilated.copy(),
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
第四步,紧接着,降低轮廓形状的复杂性。通过OpenCV的approxPolyDP来实现这一点,简而言之,它近似于轮廓的形状。在下图中,轮廓同样为蓝色,但其近似值为红色。
第五步,消除所有不是正方形的轮廓
最后,等处理完所有六个边的图像,就得到了每个正方形的RGB(红、绿、蓝)值,就像这样:
再接着是获取这些RGB值并确定正方形属于哪一侧。使用CIEDE2000算法计算两种颜色之间的距离,最终获得的结果是精确地确定每个正方形属于哪一边。
是不是觉得整个过程,妙不可言,好了,今天的内容先到这里,小伙伴们是不是都想试试这套解魔方算法,看看是不是真的那么神奇?那就赶紧:
点击下方卡片,关注公众号“TJ君”
回复“魔方”,获取项目下载地址
大家好,我是TJ
一个励志推荐10000款开源项目与工具的程序员
欢迎关注我,了解更多好玩、有趣的科技资讯